Шашки64.отд
Главная     ◄Глагол   ◄Азбука   ◄Задачи на Глаголе   Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(* Программа игры в русские шашки на языке Глагол.                            *)
(******************************************************************************)
(**)                          ОТДЕЛ Шашки64+; 
(******************************************************************************)
(* НАЗНАЧЕНИЕ: создание экранных надписей и кнопочек                          *)
(* ПРИМЕЧАНИЯ: для управления можно использовать только мышку,                *)
(*          правила игры см. в отделе \Глагол\Приложения\Игры\Шашки\Игра.отд  *)
(*                        и  в отделе \Глагол\Приложения\Игры\Шашки\Доска.отд *)
(******************************************************************************)
ИСПОЛЬЗУЕТ
  Игра     ИЗ ".\Шашки\", (* алгоритм игры *)
  Доска    ИЗ ".\Шашки\", (* рисунок доски *)
  Ввод     ИЗ "...\Отделы\Обмен\",
  ОС       ИЗ "...\Отделы\Обмен\",
  Окно     ИЗ "...\Отделы\Обмен\",
  Поле     ИЗ "...\Отделы\Поле\",
  Надел    ИЗ "...\Отделы\Поле\",
  Подложка ИЗ "...\Отделы\Поле\",
  Черта    ИЗ "...\Отделы\Поле\",
  Записка  ИЗ "...\Отделы\Поле\",
  Кнопка   ИЗ "...\Отделы\Поле\"; 

ПОСТ      (* действия *)
  дЗаново     =1; 
  дВыход      =2; 
  дПредУровень=3; 
  дСледУровень=4; 

ПЕР
  времяНижних,времяВерхних,времяОбновления:ЦЕЛ;    (* для секундомера *)
  зЖдите,зВремяН,зВремяВ,зУровень:Записка.Доступ;  (* надписи *)

(******************************************************************************)
ЗАДАЧА ОбновитьСекундомер(номерЧасов:ЦЕЛ); 
(* обновить секундомер *)
ПЕР
  прошлоВремени:ЦЕЛ; 
  сек:ЦЕЛ; 

  ЗАДАЧА ВыводХода(ход-:Игра.Ход); 
  (* вывод на табло хода машины *)
  ПЕР
    x0,y0,x1,y1:ЦЕЛ; 

    ЗАДАЧА NвXY(n,x+,y+:ЦЕЛ); 
    УКАЗ
      ЕСЛИ НЕ Доска.нижниеБелые ТО
        n:=100-n
      КОН; 
      x:=Игра.NвX[n]; 
      y:=Игра.NвY[n]
    КОН NвXY; 

  УКАЗ
    ЕСЛИ ход.откудаN = ход.кудаN ТО
      Записка.Изменить(зЖдите,"")      (* пустой ход *)
    ИНАЧЕ
      NвXY(ход.откудаN,x0,y0); 
      NвXY(ход.кудаN,x1,y1); 
      ЕСЛИ ход.битых > 0 ТО
        Записка.ИзЧЦел(зЖдите, "%c%d:%c%d", x0+ВЦЕЛ("a")-1, y0, x1+ВЦЕЛ("a")-1, y1)
      ИНАЧЕ
        Записка.ИзЧЦел(зЖдите, "%c%d-%c%d", x0+ВЦЕЛ("a")-1, y0, x1+ВЦЕЛ("a")-1, y1)
      КОН; 
    КОН
  КОН ВыводХода; 

УКАЗ
  прошлоВремени:=ОС.Время()-времяОбновления; 
  времяОбновления:=ОС.Время(); 
  ЕСЛИ Игра.конец ТО
    Записка.Изменить(зЖдите,"--КОНЕЦ--")
  ИНАЧЕ
    ЕСЛИ Доска.думаютНижние ТО
      УВЕЛИЧИТЬ(времяНижних,прошлоВремени); 
      ВыводХода(Игра.ходМашины)
    ИНАЧЕ
      УВЕЛИЧИТЬ(времяВерхних,прошлоВремени); 
      Записка.Изменить(зЖдите,"Подождите")
    КОН
  КОН; 
  сек:=времяВерхних ДЕЛИТЬ 1000; 
  Записка.ИзЧЦел(зВремяВ, "%.2d:%.2d", сек ДЕЛИТЬ 60, сек ОСТАТОК 60, 0,0); 
  сек:=времяНижних ДЕЛИТЬ 1000; 
  Записка.ИзЧЦел(зВремяН, "%.2d:%.2d", сек ДЕЛИТЬ 60, сек ОСТАТОК 60, 0,0); 
КОН ОбновитьСекундомер; 

(******************************************************************************)
ЗАДАЧА ПредУровень; 
УКАЗ
  ЕСЛИ Игра.уровень > 2 ТО 
    УМЕНЬШИТЬ(Игра.уровень); 
    Записка.ИзЧЦел(зУровень,"%d",Игра.уровень-1,0,0,0)
  КОН
КОН ПредУровень; 

(******************************************************************************)
ЗАДАЧА СледУровень; 
УКАЗ
  ЕСЛИ Игра.уровень < 10 ТО 
    УВЕЛИЧИТЬ(Игра.уровень);  
    Записка.ИзЧЦел(зУровень,"%d",Игра.уровень-1,0,0,0)
  КОН
КОН СледУровень; 

(******************************************************************************)
ЗАДАЧА НачатьЗаново(поле:Поле.Доступ); 
(* начать новую игру *)
УКАЗ
  Записка.Изменить(зЖдите,"")      (* пустой ход *)
  Записка.Изменить(зВремяН,""); 
  Записка.Изменить(зВремяВ,""); 
  времяНижних:=0; 
  времяВерхних:=0; 
  времяОбновления:=ОС.Время(); 
  Игра.НачатьЗаново; 
  Доска.НачатьЗаново; 
  Поле.Рисовать(поле)
КОН НачатьЗаново; 

(******************************************************************************)
ЗАДАЧА Приём(поле:Поле.Доступ;  посылка+:Ввод.Посылка); 
(* получить и обработать управляющие послания *)
УКАЗ
  ДЛЯ посылка ВИДА
  | Ввод.ОтКлавиш:
      ЕСЛИ посылка.упрАльт И (посылка.код = 58H) (* Alt+'X' *)
        ИЛИ (посылка.код = 1BH)                  (* Esc     *)
      ТО
        поле.состояние:=дВыход; 
        посылка.код:=0
      КОН
  | Кнопка.Посылка:
      ВЫБРАТЬ посылка.кнопка.действие ИЗ
      | дЗаново:      НачатьЗаново(поле)
      | дВыход:       поле.состояние:=дВыход
      | дПредУровень: ПредУровень
      | дСледУровень: СледУровень
      КОН
  | Доска.Посылка:
      ОбновитьСекундомер(1)
  ИНАЧЕ
  КОН             
КОН Приём; 

(******************************************************************************)
ЗАДАЧА СоздатьПоле():Поле.Доступ; 
(* создает рабочее поле экрана *)
ПЕР
  поле:Поле.Доступ;                 (* рабочее поле экрана *)
  чВертикаль,
  чГоризонталь:Черта.Доступ;        (* черты               *)
  кнЗаново,кнВыход,
  кнБольше,кнМеньше:Кнопка.Доступ;  (* управляющие кнопки  *)
  зСловоУровень:Записка.Доступ;     (* слово "Уровень"     *)
  доска:Доска.Доступ;               (* игровая доска       *)
  подложка:Подложка.Доступ;         (* подложка поля       *)
УКАЗ
  (* создаём поле *)
  поле:=Поле.Создать(0,0,10,30,ПУСТО,ОТКЛ,Приём); 
  (* создаём наделы *)
<*ЕСЛИ Доска.Оборотень ТО*>
  подложка:=Подложка.Создать(0,0,0,0,"Оборотень"); 
<*ИНАЧЕ*>
  подложка:=Подложка.Создать(0,0,0,0,""); 
<*КОН*>
  доска:=Доска.Создать(1,1); 
  зВремяВ:=Записка.Создать(1,18,1,5,"");  
  зВремяН:=Записка.Создать(8,18,1,5,"");  
  зЖдите:= Записка.Создать(2,18,1,9,"");  
  Игра.уровень:=5; 
  зУровень:=Записка.Создать(5,23,1,1,"4");  
  зСловоУровень:=Записка.Создать(4,20,1,7,"Уровень");  
  (* создаём черты *)
  чВертикаль  :=Черта.Создать(0,17,0,1);  
  чГоризонталь:=Черта.Создать(3,17,1,0);  
  (* создаём кнопки *)
  кнМеньше:=Кнопка.Создать(5,18,"[<~М]",дПредУровень,ВКЛ);  
  кнБольше:=Кнопка.Создать(5,25,"[~Б>]",дСледУровень,ВКЛ);  
  кнЗаново:=Кнопка.Создать(6,19,"[ ~Заново]",дЗаново,ВКЛ);  
  кнВыход :=Кнопка.Создать(7,19,"[ ~Выход ]",дВыход,ВКЛ);  
  (* добавляем наделы в порядке отрисовки и получения ввода *)
  Поле.ДобавитьНадел(поле,подложка); 
  Поле.ДобавитьНадел(поле,зВремяВ); 
  Поле.ДобавитьНадел(поле,зВремяН); 
  Поле.ДобавитьНадел(поле,зЖдите); 
  Поле.ДобавитьНадел(поле,зУровень); 
  Поле.ДобавитьНадел(поле,зСловоУровень); 
  Поле.ДобавитьНадел(поле,чВертикаль); 
  Поле.ДобавитьНадел(поле,чГоризонталь); 
  Поле.ДобавитьНадел(поле,доска); 
  Поле.ДобавитьНадел(поле,кнМеньше); 
  Поле.ДобавитьНадел(поле,кнБольше); 
  Поле.ДобавитьНадел(поле,кнЗаново); 
  Поле.ДобавитьНадел(поле,кнВыход); 
  ВОЗВРАТ поле
КОН СоздатьПоле; 

(******************************************************************************)
ЗАДАЧА Поехали; 
ПЕР
  поле:Поле.Доступ; 
  часы:ЦЕЛ; 
УКАЗ
  Окно.Графическое("Шашки","Lucida Console",30,ОбновитьСекундомер); 
(*
  Окно.Текстовое(ОбновитьСекундомер); 
 *)
  поле:=СоздатьПоле(); 
  Поле.ОкноНаВсёПоле(поле); 
  Поле.Рисовать(поле); 
  НачатьЗаново(поле); 
  часы:=Окно.СоздатьЧасы(1,1000);  (* обновляем часы через 1000 мс *)
  Окно.Показать; 
  (* проверяем и обрабатываем ввод от человека *)
  ПОКА поле.состояние = Поле.сРабота ВЫП
    Поле.Проверить(поле)
  КОН; 
  Окно.УдалитьЧасы(часы)
КОН Поехали; 

(******************************************************************************)
УКАЗ
  Поехали
КОН Шашки64.




Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
 email
 
Главная     ◄Глагол   ◄Азбука   ◄Задачи на Глаголе   Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы